import router from "../router";
import { RequestHandler } from "express";
import { Methods } from "./request";
// controller 是类装饰器的工厂函数，返回一个类的装饰器
export function controller(root: string) {
  //new (...args: any[]) => any 表示是构造函数
  return function (target: new (...args: any[]) => any) {
    // controller 返回的是类装饰器，这个返回的类的装饰器是一个接收参数是 constructor 的函数
    // 遍历原型链上的所有方法
    for (let key in target.prototype) {
      // 获取元数据
      // 获取 target.prototype 上，key 方法的 "path" 属性
      const path: string = Reflect.getMetadata("path", target.prototype, key);
      const method: Methods = Reflect.getMetadata(
        "method",
        target.prototype,
        key
      );
      const middlewares: RequestHandler[] = Reflect.getMetadata(
        "middlewares",
        target.prototype,
        key
      );
      const handler = target.prototype[key];
      // 如果 target.prototype 上，的这个方法有 "path" 这个属性：
      if (path && method && handler) {
        const fullPath = root === "/" ? path : `${root}${path}`;
        // 判断这个路由是否使用了中间件
        if (middlewares && middlewares.length) {
          router[method](fullPath, ...middlewares, handler);
        } else {
          router[method](fullPath, handler);
        }
      }
    }
  };
}
